

#pragma once

#include "../glm/dvec3.hpp"

CYBERTRON_BEGIN

class CartesianCoordinateSystem
{
public:
	CybertronCoreAPI CartesianCoordinateSystem();
	CybertronCoreAPI CartesianCoordinateSystem(const CartesianCoordinateSystem& rhs);
	CybertronCoreAPI CartesianCoordinateSystem& operator = (const CartesianCoordinateSystem& rhs);
	CybertronCoreAPI ~CartesianCoordinateSystem();

	CybertronCoreAPI void clear();

	CybertronCoreAPI void rotateX(double pitch);
	CybertronCoreAPI void rotateY(double yaw);
	CybertronCoreAPI void rotateZ(double rollRadian);

	CybertronCoreAPI void normalize();

	CybertronCoreAPI dvec3 localToWorld(const dvec3& v) const;
	CybertronCoreAPI dvec3 worldToLocal(const dvec3& v) const;

	CybertronCoreAPI dvec3 localToWorldDir(const dvec3& v) const;
	CybertronCoreAPI dvec3 worldToLocalDir(const dvec3& v) const;

	CybertronCoreAPI const dvec3& getCenter() const;
	CybertronCoreAPI void setCenter(const dvec3& center);

	CybertronCoreAPI const dvec3& getAxisX() const;
	CybertronCoreAPI void setAxisX(const dvec3& axisX);

	CybertronCoreAPI const dvec3& getAxisY() const;
	CybertronCoreAPI void setAxisY(const dvec3& axisY);

	CybertronCoreAPI const dvec3& getAxisZ() const;
	CybertronCoreAPI void setAxisZ(const dvec3& axisZ);

private:
	dvec3 mAxisX;
	dvec3 mAxisY;
	dvec3 mAxisZ;
	dvec3 mCenter;
};

CYBERTRON_END
